package com.zj.whichone.bean.tree;

import java.util.ArrayList;
import java.util.List;

import com.zj.whichone.bean.Menu;

/**
 * 排列数据库菜单列表
 * @author zj20160705
 * 数据库一大堆有 id、菜单名、parentId的菜单数据
 * 如果一个菜单数据a的parentId等于另一个菜单数据b的id,则a是b的子菜单，依次类推
 * 主要功能是得到数据库的菜单列表
 * 如:
数据库数据:
1	系统基础管理	0
54	用户管理	0
59	食堂承包商	0
4	管理员管理	0
3	角色管理	1
2	用户管理	1
51	信息公布	4
52	用户信息管理	4
53	食品信息管理	4
73	其他角色列表	7
72	活动列表	7
71	一键领取	7
74	问题帮助	7
58	三级菜单	51
57	食品销售信息查询	54
55	信息公告	54
56	用户点餐	54
60	窗口承包商	59

--转换后的结构：
1	系统基础管理	0
	3	角色管理	1
	2	用户管理	1

54	用户管理	0
	57	食品销售信息查询	54
	55	信息公告	54
	56	用户点餐	54

59	食堂承包商	0
	60	窗口承包商	59

4	管理员管理	0
	51	信息公布	4
		58	三级菜单	51
	52	用户信息管理	4
	53	食品信息管理	4

73	其他角色列表	7
72	活动列表	7
71	一键领取	7
74	问题帮助	7
 */
public class TreeUtil {
	/**
	 * 递归得到每个菜单的子菜单
	 * @param listMenu
	 * @param menu
	 * @return
	 */
	public static TreeMenu arountTree(List<Menu> listMenu , Menu menu){
		if(menu == null) return null;
		TreeMenu treeMenu = new TreeMenu();
		treeMenu.setMenu(menu);
		List<TreeMenu> listTreeMenu = new ArrayList<TreeMenu>();
		for(int i=0;i<listMenu.size();i++){
			Menu temp = listMenu.get(i);
			if(temp.isFlag())continue;
			if(menu.getId() == listMenu.get(i).getParentId()){
				temp.setFlag(true);
				listTreeMenu.add(arountTree(listMenu,temp));
				treeMenu.setChildTreeMenu(listTreeMenu);
			}
		}
		return treeMenu;
	}
	/**
	 * 循环每个还没有被遍历的菜单
	 * @param listMenu
	 * @return
	 */
	public static List<TreeMenu> getTree(List<Menu> listMenu){
		List<TreeMenu> listTreeMenu = new ArrayList<TreeMenu>();
		for(Menu menu : listMenu){
			if(menu.isFlag()) continue;
			menu.setFlag(true);
			listTreeMenu.add(arountTree(listMenu,menu));
		}
		return listTreeMenu;
	}
	
	/**
	 * 最开始的想法是挨着遍历，找parentId和id相等的，后来感觉不对，要是想要找到多层的目录的话，就
	 * 必须得写相应多个for循环或者while，这很明显不合理,所以才有了上面的递归方法，测试过没问题
	 * @param listMenu
	 * @return
	 */
	public List<TreeMenu> getTree0(List<Menu> listMenu){
		List<TreeMenu> listTreeMenu = new ArrayList<TreeMenu>();
		int j;
		int k;
		for(int i=0;i<listMenu.size();i++){
			Menu menu = listMenu.get(i);
			if(menu.isFlag())continue;//已经加入到树结构了
			TreeMenu tree = new TreeMenu();
			tree.setMenu(menu);
			menu.setFlag(true);
			j=i;
			do{
				j++;
				Menu childj = listMenu.get(j);
				TreeMenu childTreej = new TreeMenu();
				childTreej.setMenu(childj);
				childj.setFlag(true);
				k=j;
				k++;
				do{
					Menu childk = listMenu.get(k);
					if(childk.getParentId() == childj.getId()){
						TreeMenu childTreek = new TreeMenu();
						childTreek.setMenu(childk);
						childk.setFlag(true);
						tree.getChildTreeMenu().add(childTreek);
					}
				}while(false);
				
			}while(false);
			for(j=i;j<listMenu.size();j++){
				Menu child = listMenu.get(j);
				if(child.getParentId() == menu.getId()){
					TreeMenu childTree = new TreeMenu();
					childTree.setMenu(child);
					child.setFlag(true);
					tree.getChildTreeMenu().add(childTree);
				}
			}
		}
			return null;
	}
}
